c052209ef5f1e878100f672cd548f11a4eb388da,findbugs/src/java/edu/umd/cs/findbugs/detect/FindHEmismatch.java,FindHEmismatch,visitAfter,#JavaClass#,47

Before Change


		if (usesDefaultEquals) 
		  bugReporter.reportBug(new BugInstance("HE_HASHCODE_USE_OBJECT_EQUALS", priority).addClass(getDottedClassName()));
		else
		  bugReporter.reportBug(new BugInstance("HE_HASHCODE_NO_EQUALS", priority). addClass(getDottedClassName()));
		}
	if (!hasHashCode && (hasEqualsObject && !equalsObjectIsAbstract ||  hasEqualsSelf))  {
		if (usesDefaultHashCode) {

After Change


	String whereEqual = getDottedClassName();
	boolean classThatDefinesEqualsIsAbstract = false;
	boolean inheritedHashCodeIsFinal = false;
	boolean inheritedEqualsIsFinal = false;
	boolean inheritedHashCodeIsAbstract = false;
	boolean inheritedEqualsIsAbstract = false;
	if (!hasEqualsObject)  {
		JavaClass we = Lookup.findSuperImplementor(obj, "equals",
					"(Ljava/lang/Object;)Z", bugReporter);
		if (we == null) {
			whereEqual = "java.lang.Object";
		}
		else {
			whereEqual = we.getClassName();
			classThatDefinesEqualsIsAbstract = we.isAbstract();;
			Method m = findMethod(we, "equals", "(Ljava/lang/Object;)Z");
			if (m != null && m.isFinal()) inheritedEqualsIsFinal = true;
			if (m != null && m.isAbstract()) inheritedEqualsIsAbstract = true;
			}
		}
	boolean usesDefaultEquals = whereEqual.equals("java.lang.Object");
	String whereHashCode = getDottedClassName();
	if (!hasHashCode) {
		JavaClass wh = Lookup.findSuperImplementor(obj, "hashCode",
					"()I", bugReporter);
		if (wh == null) {
			whereHashCode = "java.lang.Object";
			}
		else {
			whereHashCode = wh.getClassName();
			Method m = findMethod(wh, "hashCode", "()I");
			if (m != null && m.isFinal()) inheritedHashCodeIsFinal = true;
			if (m != null && m.isAbstract()) inheritedHashCodeIsAbstract = true;
			}
		}
	boolean usesDefaultHashCode = whereHashCode.equals("java.lang.Object");
	if (false && (usesDefaultEquals ||  usesDefaultHashCode)) {
		try {
		  if (Repository.implementationOf(obj, "java/util/Set")
		    || Repository.implementationOf(obj, "java/util/List")
		    || Repository.implementationOf(obj, "java/util/Map")) {
		  // System.out.println(getDottedClassName() + " uses default hashCode or equals");
		  }
                } catch (ClassNotFoundException e) {
			// e.printStackTrace();
                }
	}

	if (!hasEqualsObject &&  hasEqualsSelf) {
		
		if (usesDefaultEquals)  {
		  int priority = HIGH_PRIORITY;
		  if (usesDefaultHashCode || obj.isAbstract()) 
			priority++;
		  if (!visibleOutsidePackage)
			priority++;
		  bugReporter.reportBug(new BugInstance("EQ_SELF_USE_OBJECT", priority).addClass(getDottedClassName()));
		   }
		else {
		  int priority = NORMAL_PRIORITY;
		  if (hasFields)
			priority--;
		  if (obj.isAbstract()) priority++;
		  bugReporter.reportBug(new BugInstance("EQ_SELF_NO_OBJECT", priority).addClass(getDottedClassName()));
		}
		}
	/*
	System.out.println("Class " + betterClassName);
	System.out.println("usesDefaultEquals: " + usesDefaultEquals);
	System.out.println("hasHashCode: : " + hasHashCode);
	System.out.println("usesDefaultHashCode: " + usesDefaultHashCode);
	System.out.println("hasEquals: : " + hasEqualsObject);
	*/

	if (!hasCompareToObject &&  hasCompareToSelf) {
		if (!extendsObject)
		  bugReporter.reportBug(new BugInstance("CO_SELF_NO_OBJECT", NORMAL_PRIORITY).addClass(getDottedClassName()));
		}

	// if (!hasFields) return;
	if (hasHashCode && !hashCodeIsAbstract && !(hasEqualsObject ||  hasEqualsSelf))  { 
		int priority = LOW_PRIORITY;
		if (usesDefaultEquals) 
		  bugReporter.reportBug(new BugInstance("HE_HASHCODE_USE_OBJECT_EQUALS", priority).addClass(getDottedClassName()));
		else if (!inheritedEqualsIsFinal)
		  bugReporter.reportBug(new BugInstance("HE_HASHCODE_NO_EQUALS", priority). addClass(getDottedClassName()));
		}
	if (!hasHashCode 
		&& (hasEqualsObject && !equalsObjectIsAbstract ||  hasEqualsSelf))  {